package sv.com.renacempleo.dso.red;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import sv.com.renacempleo.dso.BaseServiceImpl;
import sv.com.renacempleo.dto.ctg.CtgCatalogo;
import sv.com.renacempleo.dto.ctg.CtgDocumentos;
import sv.com.renacempleo.dto.red.RedDemandantes;
import sv.com.renacempleo.dto.red.RedDisposicionDemandante;
import sv.com.renacempleo.dto.red.RedDocumentosDemandante;
import sv.com.renacempleo.dto.red.RedExistenciaRedDemandante;
import sv.com.renacempleo.dto.red.RedFormacionDemandante;
import sv.com.renacempleo.dto.red.RedIdiomasDemandante;
import sv.com.renacempleo.dto.red.RedMedioBusquedaDemandante;
import sv.com.renacempleo.dto.red.RedPuestoBuscaDemandante;
import sv.com.renacempleo.dto.red.vinculacion.RedEstadoSeguimientoPostulante;
import sv.com.renacempleo.exception.WebException;
import sv.com.renacempleo.web.util.WebUtilidades;

public class RedDemandanteServiceImpl extends BaseServiceImpl implements RedDemandanteService{

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void guardarDemandante(RedDemandantes redDemandantes)
			throws WebException {
		
		if(redDemandantes.getRedDemandanteFechaNacimiento()!=null){
			String anio = redDemandantes.getRedDemandanteFechaNacimiento().substring(0, 4);
			String mes = redDemandantes.getRedDemandanteFechaNacimiento().substring(4, 6);
			String dia = redDemandantes.getRedDemandanteFechaNacimiento().substring(6, 8);
			String fechaNaciomiento =dia+"/"+mes+"/"+anio;
			redDemandantes.setRedDemandanteFechaNacimiento(fechaNaciomiento);
			redDemandantes.setRedDemandanteEstado("1");
		}
		if(redDemandantes.getRedDemandanteFolio() == null){
			redDemandantes.setRedDemandanteFechaRegistro(WebUtilidades.dateFormatAsDD_MM_YYYY.format(new Date()));
			save(redDemandantes);
		}else{
			update(redDemandantes);
		}
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void guardarDocumentosDemandante(Long redDemandanteFolio,
			String[] redDocumentoDemandante) throws WebException {
		String hqlQuery = "delete from RedDocumentosDemandante where redDemandante.redDemandanteFolio = :redDemandanteFolio";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redDemandanteFolio", redDemandanteFolio);
		executeNonHibernateQuery(hqlQuery, parameters);
		RedDocumentosDemandante redDocumentosDemandante = null;
		if(redDocumentoDemandante!=null){
			for (String ctgDocumentoId : redDocumentoDemandante) {
				redDocumentosDemandante = new RedDocumentosDemandante();
				redDocumentosDemandante.setCtgDocumentos(new CtgDocumentos(new Long(ctgDocumentoId)));
				redDocumentosDemandante.setRedDemandante(new RedDemandantes(redDemandanteFolio));
				save(redDocumentosDemandante);
			}
		}
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void guardarRedDemandanteFormacionAcademica(RedFormacionDemandante redFormacionDemandante) throws WebException{
		save(redFormacionDemandante);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void eliminarRedDemandanteFormacionAcademica(Long redFormacionDemandanteId) throws WebException{
		String hqlQuery = "delete from RedFormacionDemandante where redFormacionDemandanteId = :redFormacionDemandanteId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redFormacionDemandanteId", redFormacionDemandanteId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void guardarRedDemandanteIdioma(RedIdiomasDemandante redIdiomasDemandante) throws WebException{
		save(redIdiomasDemandante);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void eliminarRedDemandanteIdioma(Long redIdiomaDemandanteId) throws WebException{
		String hqlQuery = "delete from RedIdiomasDemandante where redIdiomaDemandanteId = :redIdiomaDemandanteId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redIdiomaDemandanteId", redIdiomaDemandanteId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void guardarDisposicionDemandante(Long redDemandanteFolio,
			String[] redDisposicionDemandante) throws WebException {
		String hqlQuery = "delete from RedDisposicionDemandante where redDemandante.redDemandanteFolio = :redDemandanteFolio";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redDemandanteFolio", redDemandanteFolio);
		executeNonHibernateQuery(hqlQuery, parameters);
		RedDisposicionDemandante redDisposicionDemandantes = null;
		if(redDisposicionDemandante!=null){
			for (String ctgDisposicionId : redDisposicionDemandante) {
				redDisposicionDemandantes = new RedDisposicionDemandante();
				redDisposicionDemandantes.setCtgDisposicion(new CtgCatalogo(new Long(ctgDisposicionId)));
				redDisposicionDemandantes.setRedDemandante(new RedDemandantes(redDemandanteFolio));
				save(redDisposicionDemandantes);
			}
		}
		
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void activarRedDemandante(Long redDemandanteFolio,
			String redDemandanteEstado, Long ctgMotivoRetiroId)
			throws WebException {
		Map<String, Object> parameters = new HashMap<String, Object>();
		String hqlQuery="update RedDemandantes ";
		if("1".equals(redDemandanteEstado))
			hqlQuery += "set redDemandanteEstado = :redDemandanteEstado  " +
					"where redDemandanteFolio = :redDemandanteFolio" ;
		else{
			hqlQuery += "set ctgMotivoRetiro.ctgCatalogoId = :ctgMotivoRetiroId, redDemandanteEstado = :redDemandanteEstado   " +
					" where redDemandanteFolio = :redDemandanteFolio";
			parameters.put("ctgMotivoRetiroId", ctgMotivoRetiroId);
		}
		parameters.put("redDemandanteEstado", redDemandanteEstado);
		parameters.put("redDemandanteFolio", redDemandanteFolio);
		executeNonHibernateQuery(hqlQuery, parameters);
		
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void actualizarDisposicionDemandante(Long redDemandanteFolio,
			Long ctgJornadaId, Long ctgTipoContratoId) throws WebException {
		Map<String, Object> parameters = new HashMap<String, Object>();
		String hqlQuery="update RedDemandantes set ctgJornada.ctgCatalogoId = :ctgJornadaId, " +
				"ctgTipoContrato.ctgCatalogoId = :ctgTipoContratoId " +
				" where redDemandanteFolio = :redDemandanteFolio";
		
		parameters.put("ctgJornadaId", ctgJornadaId);
		parameters.put("ctgTipoContratoId", ctgTipoContratoId);
		parameters.put("redDemandanteFolio", redDemandanteFolio);
		executeNonHibernateQuery(hqlQuery, parameters);
		
	}

	@Override
	public void guardarMonitoreoBusqueda(Long redDemandanteFolio,
			String[] redMedioBusquedaDemandantes,
			String[] redExistenciaDemandantes) throws WebException {
		String hqlQuery = "delete from RedMedioBusquedaDemandante where redDemandante.redDemandanteFolio = :redDemandanteFolio";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redDemandanteFolio", redDemandanteFolio);
		executeNonHibernateQuery(hqlQuery, parameters);
		RedMedioBusquedaDemandante redMedioBusquedaDemandante = null;
		if(redMedioBusquedaDemandantes!=null){
			for (String ctgMediosDifusionId : redMedioBusquedaDemandantes) {
				redMedioBusquedaDemandante = new RedMedioBusquedaDemandante();
				redMedioBusquedaDemandante.setCtgMediosDifusion(new CtgCatalogo(new Long(ctgMediosDifusionId)));
				redMedioBusquedaDemandante.setRedDemandante(new RedDemandantes(redDemandanteFolio));
				save(redMedioBusquedaDemandante);
			}
		}
		
		String hqlQuery2 = "delete from RedExistenciaRedDemandante where redDemandante.redDemandanteFolio = :redDemandanteFolio";
		Map<String, Object> parameters2 = new HashMap<String, Object>();
		parameters2.put("redDemandanteFolio", redDemandanteFolio);
		executeNonHibernateQuery(hqlQuery2, parameters2);
		RedExistenciaRedDemandante redExistenciaRedDemandante = null;
		if(redExistenciaDemandantes!=null){
			for (String ctgMediosDifusionId : redExistenciaDemandantes) {
				redExistenciaRedDemandante = new RedExistenciaRedDemandante();
				redExistenciaRedDemandante.setCtgMediosDifusion(new CtgCatalogo(new Long(ctgMediosDifusionId)));
				redExistenciaRedDemandante.setRedDemandante(new RedDemandantes(redDemandanteFolio));
				save(redExistenciaRedDemandante);
			}
		}
		
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void guardarRedPuestoDemandante(
			RedPuestoBuscaDemandante redPuestoBuscaDemandante)
			throws WebException {
		save(redPuestoBuscaDemandante);
		
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void eliminarRedPuestoDemandante(Long redPuestoBuscaDemandanteId)
			throws WebException {
		String hqlQuery = "delete from RedPuestoBuscaDemandante where redPuestoBuscaDemandanteId = :redPuestoBuscaDemandanteId";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("redPuestoBuscaDemandanteId", redPuestoBuscaDemandanteId);
		executeNonHibernateQuery(hqlQuery, parameters);
	}
	
	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void deleteRedDemandante(Long redDemandanteFolio) throws WebException{
		try{
			Map<String, Object> parameters = new HashMap<String, Object>();
			parameters.put("redDemandanteFolio", redDemandanteFolio);
			String hqlQuery = "delete from RedDemandantes where redDemandanteFolio = :redDemandanteFolio";
			executeNonHibernateQuery(hqlQuery, parameters);
		}catch(Exception e){
			throw new WebException("Problemas al tratar de eliminar el registro. <br />");
		}
	}

	@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = {Exception.class, WebException.class})
	public void cambiarEstadosDemandantes(
			RedEstadoSeguimientoPostulante redEstadoSeguimientoPostulante,
			Long redDemandanteFolio) throws WebException {
		guardarEstadosDemandante(redEstadoSeguimientoPostulante);
		String hqlQuery = "update RedDemandantes set ctgEstadoPostulanteVinculacion.ctgEstadoPostulanteVinculacionId = :ctgEstadoPostulanteVinculacionId" +
				" where redDemandanteFolio = :redDemandanteFolio";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("ctgEstadoPostulanteVinculacionId", 
				redEstadoSeguimientoPostulante.getCtgEstadoPostulanteVinculacion().getCtgEstadoPostulanteVinculacionId());
		parameters.put("redDemandanteFolio", redDemandanteFolio);
		executeNonHibernateQuery(hqlQuery, parameters);
		
		
	}

	public void guardarEstadosDemandante(
			RedEstadoSeguimientoPostulante redEstadoSeguimientoPostulante)
			throws WebException {
		save(redEstadoSeguimientoPostulante);
	}
	
	

}
